package cn.piesat.dao;

import cn.piesat.dto.PiesatResourceInfoDTO;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Query;

import java.util.List;

/**
 * 资源信息持久层
 *
 * @author xhl
 */
public interface PiesatResourceInfoDAO extends JpaRepository<PiesatResourceInfoDTO,String>, JpaSpecificationExecutor<PiesatResourceInfoDTO> {

    /**
     * 通过菜单ID和资源名称、资源类型查询
     * @param menuId 菜单ID
     * @param name 资源名称
     * @param type 资源类型
     * @return
     */
    PiesatResourceInfoDTO findByMenuIdAndNameAndType(String menuId, String name, String type);

    /**
     * 通过资源信息和资源类型查询
     * @param resource 资源信息
     * @param type 资源类型
     * @return
     */
    PiesatResourceInfoDTO findByResourceAndType(String resource, String type);

    /**
     * 根据菜单ID查询数量
     * @param menuIdList 菜单ID集合
     * @return
     */
    long countByMenuIdIn(List<String> menuIdList);

    List<PiesatResourceInfoDTO> findAllByMenuIdIsNullAndType(String type);

    /**
     * 以资源信息为主表，左联角色资源关系表，条件为菜单ID，资源类型和角色ID集合
     * @param menuId
     * @param type
     * @param roleIdList
     * @return
     */
    @Query(nativeQuery = true, value = "select r.RESOURCE from piesat_resource_info r" +
            " left join piesat_role_resource_relation rr on r.ID = rr.RESOURCE_ID" +
            " where r.MENU_ID = :menuId and r.TYPE = :type and rr.ROLE_ID in :roleIdList")
    List<String> findResourceLeftRoleRelation(String menuId, String type, List<String> roleIdList);

    PiesatResourceInfoDTO findByResource(String addUrl);

    List<PiesatResourceInfoDTO> findByType(String type);

    List<PiesatResourceInfoDTO> findByTypeAndLogStatus(String type, Integer logStatus);

    void deleteAllByMenuIdIn(List<String> list1);
}
